package com.ruyuan2020.im.design.flyweightpattern;
// 客户端调用案例

/**
 * 享元模式是一种用于优化性能的设计模式，它通过共享相同或相似对象来减少系统中对象的数量，从而节省内存和提高效率，
 * 其优点在于能够显著减少对象创建和销毁带来的开销，特别适用于需要大量相似对象但状态可外部化的场景。
 * 然而，享元模式也有缺点，它增加了系统的复杂性，需要额外的逻辑来管理共享对象池，并可能导致状态同步问题。
 * 当存在明确需要优化对象数量和内存占用时再考虑使用，同时要仔细设计和管理共享对象池，确保状态的一致性和正确性。
 *
 * 其它应用场景补充
 * 数据库连接池，数据库连接池是享元模式最经典的使用场景之一，在这个场景中，创建数据库连接对象需要消耗大量的资源，而且这些对象的内部状态大部分都是相同的，因此，可以通过享元模式来共享这些对象，减少对象的创建和销毁，提高系统的性能和可扩展性。
 *
 * 线程池，线程池也是享元模式的一个应用场景，线程的创建和销毁需要消耗大量的资源，而且线程的内部状态大部分都是相同的，因此，可以通过享元模式来共享线程对象，避免频繁地创建和销毁线程。
 *
 * 大数据处理，在处理大量数据时，可能会存在大量的重复对象，如图像处理中的像素点、文本处理中的单词等，这些对象可以通过享元模式来减少内存消耗和提高处理速度。
 */
public class Client {
    public static void main(String[] args) {
        // 通过享元工厂获取Circle对象，如果具有相同属性的对象已经存在，则直接重用该对象
        for (int i = 0; i < 5; i++) {
            Circle circle = Circle.getCircle("Red", 0, 0, 1); // 请求相同属性的圆形对象
            circle.draw(); // 调用绘制方法，将看到是同一个对象被重用
        }
        System.out.println("------------------");
        // 请求不同属性的圆形对象，将会创建新的对象实例
        Circle anotherCircle = Circle.getCircle("Blue", 1, 1, 2);
        anotherCircle.draw(); // 调用绘制方法，将看到是一个新的对象被创建并绘制
    }
}
